from typing import Dict, Optional
from app.db.crud import get_db
from sqlalchemy.orm import Session
from fastapi import APIRouter, Depends
from app.common.security import check_jwt_token
from app.api.schemas.user import User_Schema, User_Update_Schema
from app.db.crud.user_crud import get_user, register_user, update_userinfo, del_user
from app.common.response_code import resp_200, resp_202
import uuid

# 实例化API路由，需注册到主路由上去
userAdminAPI = APIRouter(dependencies=[Depends(check_jwt_token)])

# 注册新用户API
@userAdminAPI.post("/register", summary="注册用户接口")
async def register(user: User_Schema, db: Session = Depends(get_db)):
    """
    注册新用户的API接口
    
    :param user: 包含用户信息的User_Schema对象
    :param db: 数据库会话对象，通过依赖注入获取
    :return: 注册成功的响应或用户已存在的错误响应
    """
    # 检查用户是否已存在
    if get_user(db, user.login_name):
        # 如果用户已存在，返回406错误响应
        return resp_202(user.login_name, message="用户已存在")
    else:
        # 如果用户不存在，调用register_user函数注册新用户，并返回200成功响应
        return resp_200(register_user(db, user), message="新用户注册成功")

# 获取用户信息API
@userAdminAPI.post("/get_users", summary="获取用户信息接口")
async def get_users(user: Optional[Dict] = None, db: Session = Depends(get_db)):
    """
    根据用户名获取用户信息
    
    :param user: 包含用户名的字典，默认为None
    :param db: 数据库会话对象，通过依赖注入获取
    :return: 用户信息或所有用户信息
    """
    if user:
        # 如果提供了用户名，调用get_user函数获取该用户信息
        return resp_200(get_user(db, user["login_name"]), message="获取用户信息成功")
    else:
        # 如果未提供用户名，调用get_user函数获取所有用户信息
        return resp_200(get_user(db, None), message="获取所有用户信息成功")

# 更新用户API
@userAdminAPI.post("/update_user", summary="更新用户接口")
async def update_user(user: User_Update_Schema, db: Session = Depends(get_db)):
    """
    更新用户信息的API接口
    
    :param user: 包含用户信息的User_Update_Schema对象
    :param db: 数据库会话对象，通过依赖注入获取
    :return: 更新成功的响应或用户不存在的错误响应
    """
    # 检查待更新用户的信息是否为空
    if user is None:
        # 如果用户信息为空，返回406错误响应
        return resp_202(user, message="待更新用户信息不能为空")
    
    # 检查用户是否存在
    if get_user(db, user.login_name) is None:
        # 如果用户信息不存在，返回406错误响应
        return resp_202(user.login_name, message="用户信息不存在")
    else:
        # 如果用户信息存在，调用update_userinfo函数更新用户信息，并返回200成功响应
        return resp_200(update_userinfo(db, user), message='用户信息更新成功')

# 删除用户API
@userAdminAPI.post("/deleteuser", summary="删除用户接口")
def delete_user(user: Dict, db: Session = Depends(get_db)):
    """
    删除用户的API接口
    
    :param user: 包含用户名的字典
    :param db: 数据库会话对象，通过依赖注入获取
    :return: 删除成功的响应或用户不存在的错误响应
    """
    if user is None:
        # 如果用户信息为空，返回406错误响应
        return resp_202(user, message="待删除用户信息不能为空")

    # 检查用户是否存在
    if get_user(db, user["login_name"]) is None:
        # 如果用户信息不存在，返回406错误响应
        return resp_202(user["login_name"], message="用户信息不存在")
    else:
        # 如果用户信息存在，返回200成功响应
        return resp_200(del_user(db, user["login_name"]), message="删除用户成功")
    